import time
import threading
import numpy as np
import pandas as pd
import sqlite3
from tqsdk import TqApi, TqAuth, TqKq
from MyTT import EMA, SUM
from rich.console import Console
from rich.theme import Theme
from MyTT import REF, EMA

# 定义颜色主题
custom_theme = Theme({
    "info": "cyan",
    "warning": "yellow",
    "error": "red",
    "success": "green",
    "trade": "bold magenta"
})
console = Console(theme=custom_theme)


api = TqApi(account=TqKq(), auth=TqAuth("cps168", "alibaba"))

try:
    conn = sqlite3.connect('trade_monitor.db')
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM products WHERE is_monitored=1")
    products = cursor.fetchall()
    conn.close()
    symbols=[row[2] for row in products]
except Exception as e:
    print(f"从数据库获取监控品种时出错: {e}", style="error")

console.print(f"开始监控品种: {symbols}", style="info")

while True:
        console.print(f"{time.strftime('%X')} 开始检查止损条件", style="warning")
        for symbol in symbols:
            klines = api.get_kline_serial(symbol, 60,data_length=300)
            position = api.get_position(symbol)
            console.print(f"{time.strftime('%X')} 开始处理 {symbol}", style="warning") 
            api.wait_update(deadline=time.time() + 1)
            if True:#api.is_changing(klines, "datetime"):
                console.print(f"{time.strftime('%X')} 数据更新", style="info")
                try:
                    close = klines.close
                    low = klines.low
                    open = klines.open
                    high = klines.high
                    # 转换为列表，方便使用 MyTT 计算
                    close = [int(x) for x in close]
                    low = [int(x) for x in low]
                    open = [int(x) for x in open]
                    high = [int(x) for x in high]

                    Q=(3*close+low+open+high)/6
                    # 计算操盘线
                    trading_line=(26*Q+25*REF(Q,1)+24*REF(Q,2)+23*REF(Q,3)+22*REF(Q,4)+21*REF(Q,5)+20*REF(Q,6)+19*REF(Q,7)+18*REF(Q,8)+17*REF(Q,9)+16*REF(Q,10)+15*REF(Q,11)+14*REF(Q,12)+13*REF(Q,13)+12*REF(Q,14)+11*REF(Q,15)+10*REF(Q,16)+9*REF(Q,17)+8*REF(Q,18)+7*REF(Q,19)+6*REF(Q,20)+5*REF(Q,21)+4*REF(Q,22)+3*REF(Q,23)+2*REF(Q,24)+REF(Q,26))/351
                    # 计算空头线
                    short_line = EMA(trading_line, 7)
                    # 平仓条件判断
                    print("条件值是：",trading_line[-2],short_line[-2])
                    if len(trading_line) >= 2 and len(short_line) >= 2:
                        if position.pos_short > 0 and trading_line[-2] > short_line[-2]:
                            api.insert_order(
                                symbol=symbol,
                                direction="BUY",
                                offset="CLOSE",
                                volume=position.pos_short
                            )
                            console.print(
                                f"{time.strftime('%X')} 平空仓: {symbol} 手数: {position.pos_short}",
                                style="trade"
                            )

                        if position.pos_long > 0 and trading_line[-2] < short_line[-2]:
                            api.insert_order(
                                symbol=symbol,
                                direction="SELL",
                                offset="CLOSE",
                                volume=position.pos_long
                            )
                            console.print(
                                f"{time.strftime('%X')} 平多仓: {symbol} 手数: {position.pos_long}",
                                style="trade"
                            )
                except Exception as e:
                    console.print(f"处理 {symbol} 止损逻辑时出错: {e}", style="error")   
                finally:
                    api.close()     


